Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / backend / message_blocklist.py

Displaying Raw • Download


meshchatx/src/backend/message_blocklist.py fa46dc4ce9ab50cbe66a7a9e4b3bca0140102345 (fa46dc4c) Text, 6.78 KB

T8b949e# SPDX-License-Identifier: 0BSD

T8b949e"""LXMF message blocklist: match spam phrases (substring or regex) and auto-banish."""

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations

Tff7b72import T7ee787json
Tff7b72import T7ee787re
Tff7b72import T7ee787uuid
Tff7b72from T7ee787typing Tff7b72import Te6edf3Any

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787lxmf_sieve Tff7b72import Tb4b4b4(
Te6edf3_any_term_matches_regexTb4b4b4,
Te6edf3_any_term_matches_substringTb4b4b4,
Te6edf3_rule_scope_matchesTb4b4b4,
Tb4b4b4)

Te6edf3MAX_ENTRIES Tff7b72= T79c0ff256
Te6edf3MAX_TERM_LEN Tff7b72= T79c0ff512
Te6edf3BLOCKLIST_SCOPES Tff7b72= Tffa657frozensetTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffeveryoneTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcontactsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffnon_contactsTa5d6ff"Tb4b4b4}Tb4b4b4)
Te6edf3MATCH_MODES Tff7b72= Tffa657frozensetTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffsubstringTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffregexTa5d6ff"Tb4b4b4}Tb4b4b4)
Te6edf3EXPORT_SCHEMA Tff7b72= Ta5d6ff"Ta5d6ffmeshchatx.message_blocklistTa5d6ff"
Te6edf3EXPORT_VERSION Tff7b72= T79c0ff1

Te6edf3_REGEX_FLAGS Tff7b72= Te6edf3reTff7b72.Td2a8ffIGNORECASE Tff7b72| Te6edf3reTff7b72.Td2a8ffDOTALL


Tff7b72def Td2a8ff_new_entry_idTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72return Te6edf3uuidTff7b72.Td2a8ffuuid4Tb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffhexTb4b4b4[Tb4b4b4:T79c0ff16Tb4b4b4]


Tff7b72def Td2a8ff_validate_regex_patternTb4b4b4(Te6edf3patternTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657str Tff7b72| Tff7b72NoneTb4b4b4:
Te6edf3p Tff7b72= Tffa657strTb4b4b4(Te6edf3patternTb4b4b4)Tb4b4b4[Tb4b4b4:Te6edf3MAX_TERM_LENTb4b4b4]
Tff7b72if Tff7b72not Te6edf3pTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72tryTb4b4b4:
Te6edf3reTff7b72.Td2a8ffcompileTb4b4b4(Te6edf3pTb4b4b4, Te6edf3_REGEX_FLAGSTb4b4b4)
Tff7b72except Te6edf3reTff7b72.Td2a8fferrorTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Te6edf3p


Tff7b72def Td2a8ff_normalize_scopeTb4b4b4(Te6edf3rawTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657strTb4b4b4:
Tff7b72if Te6edf3raw Tff7b72in Te6edf3BLOCKLIST_SCOPESTb4b4b4:
Tff7b72return Te6edf3raw
Tff7b72return Ta5d6ff"Ta5d6ffnon_contactsTa5d6ff"


Tff7b72def Td2a8ff_normalize_entryTb4b4b4(Te6edf3itemTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72| Tff7b72NoneTb4b4b4:
Te6edf3text_in Tff7b72= Te6edf3itemTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3itemTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftermTa5d6ff"Tb4b4b4) Tff7b72or Te6edf3itemTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffpatternTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"
Te6edf3text Tff7b72= Tffa657strTb4b4b4(Te6edf3text_inTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:Te6edf3MAX_TERM_LENTb4b4b4]
Tff7b72if Tff7b72not Te6edf3textTb4b4b4:
Tff7b72return Tff7b72None

Te6edf3match_mode Tff7b72= Te6edf3itemTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmatch_modeTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ffsubstringTa5d6ff"
Tff7b72if Te6edf3match_mode Tff7b72not Tff7b72in Te6edf3MATCH_MODESTb4b4b4:
Te6edf3match_mode Tff7b72= Ta5d6ff"Ta5d6ffsubstringTa5d6ff"

Tff7b72if Te6edf3match_mode Tff7b72== Ta5d6ff"Ta5d6ffregexTa5d6ff"Tb4b4b4:
Te6edf3validated Tff7b72= Te6edf3_validate_regex_patternTb4b4b4(Te6edf3textTb4b4b4)
Tff7b72if Te6edf3validated Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72None
Te6edf3text Tff7b72= Te6edf3validated

Te6edf3rid Tff7b72= Tffa657strTb4b4b4(Te6edf3itemTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4) Tff7b72or Te6edf3_new_entry_idTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Te6edf3ridTb4b4b4,
Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3itemTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4: Te6edf3textTb4b4b4,
Ta5d6ff"Ta5d6ffmatch_modeTa5d6ff"Tb4b4b4: Te6edf3match_modeTb4b4b4,
Tb4b4b4}


Tff7b72def Td2a8ffnormalize_message_blocklistTb4b4b4(Te6edf3dataTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
T8b949e"""Validate and normalize blocklist settings from user input."""
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Tb4b4b4{Tb4b4b4}

Te6edf3scope Tff7b72= Te6edf3_normalize_scopeTb4b4b4(Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffscopeTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3match_peer_fields Tff7b72= Tffa657boolTb4b4b4(Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmatch_peer_fieldsTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4)
Te6edf3match_message Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmatch_messageTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3match_message Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3match_message Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3match_message Tff7b72= Tffa657boolTb4b4b4(Te6edf3match_messageTb4b4b4)
Tff7b72if Tff7b72not Te6edf3match_peer_fields Tff7b72and Tff7b72not Te6edf3match_messageTb4b4b4:
Te6edf3match_message Tff7b72= Tff7b72True

Te6edf3entries_in Tff7b72= Te6edf3dataTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3entries_inTb4b4b4, Tffa657listTb4b4b4)Tb4b4b4:
Te6edf3entries_in Tff7b72= Tb4b4b4[Tb4b4b4]

Te6edf3entriesTb4b4b4: Tffa657listTb4b4b4[Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4] Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3item Tff7b72in Te6edf3entries_inTb4b4b4[Tb4b4b4:Te6edf3MAX_ENTRIESTb4b4b4]Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3itemTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3normalized Tff7b72= Te6edf3_normalize_entryTb4b4b4(Te6edf3itemTb4b4b4)
Tff7b72if Te6edf3normalized Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3entriesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3normalizedTb4b4b4)

Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffscopeTa5d6ff"Tb4b4b4: Te6edf3scopeTb4b4b4,
Ta5d6ff"Ta5d6ffmatch_peer_fieldsTa5d6ff"Tb4b4b4: Te6edf3match_peer_fieldsTb4b4b4,
Ta5d6ff"Ta5d6ffmatch_messageTa5d6ff"Tb4b4b4: Te6edf3match_messageTb4b4b4,
Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4: Te6edf3entriesTb4b4b4,
Tb4b4b4}


Tff7b72def Td2a8ffparse_message_blocklist_jsonTb4b4b4(Te6edf3rawTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3raw Tff7b72or Tff7b72not Tffa657strTb4b4b4(Te6edf3rawTb4b4b4)Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3normalize_message_blocklistTb4b4b4(Tb4b4b4{Tb4b4b4}Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3rawTb4b4b4)
Tff7b72except Tb4b4b4(Te6edf3jsonTff7b72.Td2a8ffJSONDecodeErrorTb4b4b4, Tf85149TypeErrorTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3normalize_message_blocklistTb4b4b4(Tb4b4b4{Tb4b4b4}Tb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3dataTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3normalize_message_blocklistTb4b4b4(Tb4b4b4{Tb4b4b4}Tb4b4b4)
Tff7b72return Te6edf3normalize_message_blocklistTb4b4b4(Te6edf3dataTb4b4b4)


Tff7b72def Td2a8ff_entry_matchesTb4b4b4(Te6edf3entryTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4, Te6edf3text_lowerTb4b4b4: Tffa657strTb4b4b4, Te6edf3text_rawTb4b4b4: Tffa657strTb4b4b4) Tff7b72-Tff7b72> Tffa657boolTb4b4b4:
Te6edf3pattern Tff7b72= Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ff"
Te6edf3mode Tff7b72= Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmatch_modeTa5d6ff"Tb4b4b4) Tff7b72or Ta5d6ff"Ta5d6ffsubstringTa5d6ff"
Tff7b72if Te6edf3mode Tff7b72== Ta5d6ff"Ta5d6ffregexTa5d6ff"Tb4b4b4:
Tff7b72return Te6edf3_any_term_matches_regexTb4b4b4(Tb4b4b4[Te6edf3patternTb4b4b4]Tb4b4b4, Te6edf3text_rawTb4b4b4)
Tff7b72return Te6edf3_any_term_matches_substringTb4b4b4(Tb4b4b4[Te6edf3patternTb4b4b4]Tb4b4b4, Te6edf3text_lowerTb4b4b4)


Tff7b72def Td2a8fffirst_matching_blocklist_entryTb4b4b4(
Te6edf3blocklistTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4,
Te6edf3peer_haystackTb4b4b4: Tffa657str Tff7b72| Tff7b72NoneTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3is_contactTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Te6edf3message_haystackTb4b4b4: Tffa657str Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""Return the first enabled entry whose scope and targets match."""
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3blocklistTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None
Tff7b72if Tff7b72not Te6edf3_rule_scope_matchesTb4b4b4(Te6edf3blocklistTb4b4b4, Te6edf3is_contactTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None

Te6edf3peer_raw Tff7b72= Te6edf3peer_haystack Tff7b72or Ta5d6ff"Ta5d6ff"
Te6edf3peer_lower Tff7b72= Te6edf3peer_rawTff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Te6edf3msg_raw Tff7b72= Te6edf3message_haystack
Te6edf3msg_lower Tff7b72= Tb4b4b4(Te6edf3message_haystack Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)

Te6edf3peer_fields Tff7b72= Tffa657boolTb4b4b4(Te6edf3blocklistTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmatch_peer_fieldsTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4)
Te6edf3match_msg Tff7b72= Tffa657boolTb4b4b4(Te6edf3blocklistTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmatch_messageTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)Tb4b4b4)

Tff7b72for Te6edf3entry Tff7b72in Te6edf3blocklistTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4) Tff7b72or Tb4b4b4[Tb4b4b4]Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72continue

Te6edf3peer_ok Tff7b72= Tff7b72True
Tff7b72if Te6edf3peer_fieldsTb4b4b4:
Te6edf3peer_ok Tff7b72= Te6edf3_entry_matchesTb4b4b4(Te6edf3entryTb4b4b4, Te6edf3peer_lowerTb4b4b4, Te6edf3peer_rawTb4b4b4)

Te6edf3msg_ok Tff7b72= Tff7b72True
Tff7b72if Te6edf3match_msgTb4b4b4:
Tff7b72if Te6edf3msg_raw Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72continue
Te6edf3msg_ok Tff7b72= Te6edf3_entry_matchesTb4b4b4(Te6edf3entryTb4b4b4, Te6edf3msg_lowerTb4b4b4, Te6edf3msg_rawTb4b4b4)

Tff7b72if Te6edf3peer_ok Tff7b72and Te6edf3msg_okTb4b4b4:
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffentry_idTa5d6ff"Tb4b4b4: Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4: Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmatch_modeTa5d6ff"Tb4b4b4: Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmatch_modeTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72return Tff7b72None


Tff7b72def Td2a8ffbuild_export_documentTb4b4b4(Te6edf3blocklistTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4]Tb4b4b4:
Te6edf3normalized Tff7b72= Te6edf3normalize_message_blocklistTb4b4b4(Te6edf3blocklistTb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffschemaTa5d6ff"Tb4b4b4: Te6edf3EXPORT_SCHEMATb4b4b4,
Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Te6edf3EXPORT_VERSIONTb4b4b4,
Ta5d6ff"Ta5d6ffscopeTa5d6ff"Tb4b4b4: Te6edf3normalizedTb4b4b4[Ta5d6ff"Ta5d6ffscopeTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffmatch_peer_fieldsTa5d6ff"Tb4b4b4: Te6edf3normalizedTb4b4b4[Ta5d6ff"Ta5d6ffmatch_peer_fieldsTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffmatch_messageTa5d6ff"Tb4b4b4: Te6edf3normalizedTb4b4b4[Ta5d6ff"Ta5d6ffmatch_messageTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4: Tb4b4b4[
Tb4b4b4{
Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4: Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffmatch_modeTa5d6ff"Tb4b4b4: Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6ffmatch_modeTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4: Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4]Tb4b4b4,
Tb4b4b4}
Tff7b72for Te6edf3e Tff7b72in Te6edf3normalizedTb4b4b4[Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4]
Tb4b4b4]Tb4b4b4,
Tb4b4b4}


Tff7b72def Td2a8ffparse_import_documentTb4b4b4(
Te6edf3documentTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72| Tff7b72NoneTb4b4b4,
Tff7b72*Tb4b4b4,
Te6edf3mergeTb4b4b4: Tffa657bool Tff7b72= Tff7b72FalseTb4b4b4,
Te6edf3existingTb4b4b4: Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4,
Tb4b4b4) Tff7b72-Tff7b72> Tffa657dictTb4b4b4[Tffa657strTb4b4b4, Te6edf3AnyTb4b4b4] Tff7b72| Tff7b72NoneTb4b4b4:
T8b949e"""Parse a shared blocklist document. Returns normalized blocklist or None."""
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3documentTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72None

Te6edf3schema Tff7b72= Te6edf3documentTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffschemaTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3schema Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3schema Tff7b72!= Te6edf3EXPORT_SCHEMATb4b4b4:
Tff7b72return Tff7b72None

Te6edf3version Tff7b72= Te6edf3documentTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3version Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657intTb4b4b4(Te6edf3versionTb4b4b4) Tff7b72!= Te6edf3EXPORT_VERSIONTb4b4b4:
Tff7b72return Tff7b72None

Te6edf3imported Tff7b72= Te6edf3normalize_message_blocklistTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffscopeTa5d6ff"Tb4b4b4: Te6edf3documentTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffscopeTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmatch_peer_fieldsTa5d6ff"Tb4b4b4: Te6edf3documentTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmatch_peer_fieldsTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmatch_messageTa5d6ff"Tb4b4b4: Te6edf3documentTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmatch_messageTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4: Te6edf3documentTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)

Tff7b72if Tff7b72not Te6edf3mergeTb4b4b4:
Tff7b72return Te6edf3imported

Te6edf3base Tff7b72= Te6edf3normalize_message_blocklistTb4b4b4(Te6edf3existing Tff7b72or Tb4b4b4{Tb4b4b4}Tb4b4b4)
Te6edf3seen Tff7b72= Tb4b4b4{Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3e Tff7b72in Te6edf3baseTb4b4b4[Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4]Tb4b4b4}
Te6edf3merged_entries Tff7b72= Tffa657listTb4b4b4(Te6edf3baseTb4b4b4[Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72for Te6edf3entry Tff7b72in Te6edf3importedTb4b4b4[Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3key Tff7b72= Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3key Tff7b72in Te6edf3seenTb4b4b4:
Tff7b72continue
Te6edf3seenTff7b72.Td2a8ffaddTb4b4b4(Te6edf3keyTb4b4b4)
Te6edf3merged_entriesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3entryTb4b4b4)
Te6edf3baseTb4b4b4[Ta5d6ff"Ta5d6ffentriesTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3merged_entriesTb4b4b4[Tb4b4b4:Te6edf3MAX_ENTRIESTb4b4b4]
Tff7b72return Te6edf3base


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────